const express = require('express');

const router = express.Router();

// 导入 Panda 模型并基于此模型实现 单表 CRUD 操作
const Panda = require('../models/Panda.js');

// GET `/panda/add` 打开用于添加熊猫的页面 (add.njk)
router.get('/panda/add',(req,resp)=>{
    // 获得与当前请求关联的会话对象
    const session = req.session ;
    let { tip, nameTip , genderTip , birthdateTip } = session ;
    let localeVariables = {
        tip,
        nameTip, /* 是 `namtTip: nameTip` 的缩写 */
        genderTip,
        birthdateTip
    }
    delete session.tip ;
    delete session.nameTip ;
    delete session.genderTip ;
    delete session.birthdateTip ;
    // `/views/` + `panda/add` + `.njk`
    resp.render('panda/add',localeVariables);
});

const validate = type => {
    // 定义一个中间件函数
    let middleware = function(req,resp,next){

        console.log( 'body: ' , req.body );

        let url = '/' ;
        switch( type ) {
            case 'add': 
                url = '/panda/add'
                break;
            case 'edit':
                url = `/panda/edit/${ req.body.id }`
                break;
        }

        console.log( 'url: ' , url );

        // 获得与当前请求关联的会话对象
        const session = req.session ;
        let { id , name , gender , birthdate } = req.body ;

        // 如果某个变量取值为 false、0、NaN、undefined、null、空字符串 则认为它是 false
        if( !name ) {
            session.nameTip = { value: '' , message: '请输入熊猫名称' };
        } else {
            session.nameTip = { value: name , message: '' };
        }

        if( !gender ) {
            session.genderTip = { value: '' , message: '请选择熊猫性别' };
        } else {
            session.genderTip = { value: gender , message: '' };
        }

        if( !birthdate ) {
            session.birthdateTip = { value: '' , message: '请选择熊猫出生日期' }
        } else {
            console.log( 'birthdate: ' , birthdate , typeof birthdate );
            session.birthdateTip = { value: birthdate , message: '' }
        }

        session.idTip = { value: id , message: '' };

        // 若 name 、gender 、birthdate 中有任意一个未确定值
        if( !name || !gender || !birthdate ) {
            resp.redirect( url );
            return;
        }

        // 调用下一个中间件
        next();
    }
    // 返回中间件函数
    return middleware ;
}

// 为 添加熊猫创建 数据校验 中间件 (参数 `add` 表示为 添加熊猫 做校验)
let addValidator = validate( 'add' );

// POST `/panda/add` 用于接受来自添加页面的数据并保存到数据库中
router.post('/panda/add',addValidator,(req,resp)=>{
    const session = req.session ;
    let { name , gender , birthdate } = req.body ;
    let p = { name , gender , birthdate };
    Panda.create( p ).then( count => {
        resp.redirect( '/panda/list' );
    }).catch( reason => {
        session.tip = { message: reason } 
        resp.redirect('/panda/add');
    });
});

// GET `/panda/list` 用于展示熊猫列表
router.get('/panda/list',(req,resp)=>{
    Panda.findAll({
        // 指定排序条件
        order: [ 
            [ 'birthdate' , 'ASC' ] , 
            [ 'id' , 'DESC' ] 
        ]
    }).then( rows => {
        // 借助于 Array.prototype.map 函数
        // 将 rows 数组中的每个元素经过 参数对应的函数 处理后映射到一个新的数组中
        return rows.map( row => row.dataValues );
    }).then( pandas => {
          console.log( pandas );
          let locales = {
            message: req.session.message,
            pandas // `pandas` 是 `pandas: pandas` 缩写
          }
          // 从 会话中删除 message 属性
          delete req.session.message ;
          // `/views/` + `panda/list` + `.njk`
          resp.render('panda/list' , locales );
    }).catch( reason => {
          let locales = {
            message: reason
          }
          resp.render('panda/list' , locales );
    });
})

// GET `/panda/edit/:id` 用于显示修改熊猫的页面
router.get('/panda/edit/:id',(req,resp)=>{
    // 获得与当前请求关联的会话对象
    const session = req.session ;
    let { tip, idTip , nameTip , genderTip , birthdateTip } = session ;
    // 只要有错误提示信息就直接去往 edit.njk 而不查询数据库
    if( tip || idTip || nameTip || genderTip || birthdateTip ) {
        let localeVariables = {
            tip,
            idTip,
            nameTip, /* 是 `namtTip: nameTip` 的缩写 */
            genderTip,
            birthdateTip
        }
        delete session.tip ;
        delete session.idTip ;
        delete session.nameTip ;
        delete session.genderTip ;
        delete session.birthdateTip ;
        // `/views/` + `panda/edit` + `.njk`
        resp.render('panda/edit',localeVariables);
        return;
    }

    // 从 路由参数中获取 id 的值
    let { id } = req.params ;
    // 根据主键值查询数据库
    Panda.findByPk( id )
    .then( row => row.dataValues )
    .then( panda => {
        console.log( 'panda: ' , panda );
        let locales = {
            panda
        }
        resp.render('panda/edit' , locales );
    }).catch( reason => {
        resp.render( 'panda/edit' , { tip: { message: '查询失败' , reason } } );
    });
});

// 为 编辑熊猫创建 数据校验 中间件 (参数 `edit` 表示为编辑熊猫做校验)
let editValidator = validate( 'edit' );

// POST `/panda/edit` 用于接受修改页面的数据并将修改后的数据同步到数据库
router.post('/panda/edit', editValidator, (req,resp)=>{
    console.log( 'body: ' , req.body );
    let { id , name , gender , birthdate } = req.body ;
    let panda = { name , gender , birthdate };
    Panda.update( panda , { 
        where: { 
            id 
        }
    }).then( count => {
        console.log( `已更新${count}行`);
        resp.redirect( '/panda/list' );
    }).catch( reason => {
        let locales = {
            tip: { message: '更新失败' , reason: reason },
            idTip: { value: id , message: '' },
            nameTip: { value: name , message: '' },
            genderTip: { value: gender , message: '' },
            birthdateTip: { value: birthdate , message: '' },
        }
        resp.redirect(`/panda/edit/${id}`,locales);
    })
});

// GET `/panda/remove/:id` 用于删除单个熊猫
router.get('/panda/remove/:id',(req,resp)=>{
    let session = req.session ;
    // 获取路由参数
    let { id } = req.params ;
    Panda.destroy({
        where: {
            id /* `id` 是 `id: id` 的缩写*/
        }
    }).then( count => {
        console.log( `已删除${count}条` );
        if( count === 0 ) {
            session.message = '删除失败';
        }
        resp.redirect('/panda/list');
    }).catch( reason => {
        session.message = `删除失败(${reason})`;
        resp.redirect('/panda/list');
    });
});


module.exports = router;